home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Software of the Month Club / Amiga General Interest Volume 220 (1995)(SOMC)(Disk 2 of y)[SMCxxxC30Ix].zip / Amiga General Interest Volume 220 (1995)(SOMC)(Disk 2 of y)[SMCxxxC30Ix].adf / Typeface / Source / char.c next >
C/C++ Source or Header  |  1995-09-30  |  19KB  |  691 lines

  1. /*********************/
  2. /*             */
  3. /* Character editing */
  4. /*             */
  5. /*********************/
  6.  
  7. #include "Typeface.h"
  8.  
  9. ULONG PixelBorder = 1;
  10. extern struct Preferences Prefs;
  11.  
  12. struct VectorItem LineArrowLeft[] =
  13.   { 10,10,VIF_SCALE,
  14.     SHADOWPEN,0,VIF_DRIPEN,
  15.      2, 5,VIF_MOVE,
  16.      8, 2,VIF_DRAW,
  17.      8, 8,VIF_DRAW,
  18.      2, 5,VIF_DRAW,
  19.      0, 0,VIF_LASTITEM };
  20. struct VectorItem LineArrowRight[] =
  21.   { 10,10,VIF_SCALE,
  22.     SHADOWPEN,0,VIF_DRIPEN,
  23.      8, 5,VIF_MOVE,
  24.      2, 2,VIF_DRAW,
  25.      2, 8,VIF_DRAW,
  26.      8, 5,VIF_DRAW,
  27.      0, 0,VIF_LASTITEM };
  28. struct VectorItem SolidArrowLeft[] =
  29.   { 10,10,VIF_SCALE,
  30.     SHADOWPEN,0,VIF_AOLDRIPEN,
  31.      0, 0,VIF_AREASTART,
  32.      2, 5,VIF_MOVE,
  33.      8, 2,VIF_DRAW,
  34.      8, 8,VIF_DRAW,
  35.      2, 5,VIF_DRAW,
  36.      0, 0,VIF_AREAEND,
  37.      0, 0,VIF_LASTITEM };
  38. struct VectorItem SolidArrowRight[] =
  39.   { 10,10,VIF_SCALE,
  40.     SHADOWPEN,0,VIF_AOLDRIPEN,
  41.      0, 0,VIF_AREASTART,
  42.      8, 5,VIF_MOVE,
  43.      2, 2,VIF_DRAW,
  44.      2, 8,VIF_DRAW,
  45.      8, 5,VIF_DRAW,
  46.      0, 0,VIF_AREAEND,
  47.      0, 0,VIF_LASTITEM };
  48. struct VectorItem SolidArrowUp[] =
  49.   { 11,11,VIF_SCALE,
  50.     SHADOWPEN,0,VIF_AOLDRIPEN,
  51.      0, 0,VIF_AREASTART,
  52.      5, 2,VIF_MOVE,
  53.      2, 8,VIF_DRAW,
  54.      8, 8,VIF_DRAW,
  55.      5, 2,VIF_DRAW,
  56.      0, 0,VIF_AREAEND,
  57.      0, 0,VIF_LASTITEM };
  58. struct VectorItem SolidArrowDown[] =
  59.   { 11,11,VIF_SCALE,
  60.     SHADOWPEN,0,VIF_AOLDRIPEN,
  61.      0, 0,VIF_AREASTART,
  62.      5, 8,VIF_MOVE,
  63.      2, 2,VIF_DRAW,
  64.      8, 2,VIF_DRAW,
  65.      5, 8,VIF_DRAW,
  66.      0, 0,VIF_AREAEND,
  67.      0, 0,VIF_LASTITEM };
  68. struct VectorItem KernImage[] =
  69.   { 11,11,VIF_SCALE,
  70.     SHINEPEN,0,VIF_AOLDRIPEN,
  71.     SHINEPEN,0,VIF_DRIPEN,
  72.      0, 0,VIF_AREASTART,
  73.      2, 2,VIF_MOVE,
  74.      2, 8,VIF_DRAW,
  75.      5, 8,VIF_DRAW,
  76.      2, 2,VIF_DRAW,
  77.      0, 0,VIF_AREAEND,
  78.     SHADOWPEN,0,VIF_AOLDRIPEN,
  79.     SHADOWPEN,0,VIF_DRIPEN,
  80.      0, 0,VIF_AREASTART,
  81.      5, 2,VIF_MOVE,
  82.      8, 2,VIF_DRAW,
  83.      8, 8,VIF_DRAW,
  84.      5, 2,VIF_DRAW,
  85.      0, 0,VIF_AREAEND,
  86.      0, 0,VIF_LASTITEM };
  87. struct VectorItem WidthImage[] =
  88.   { 10,10,VIF_SCALE,
  89.     SHINEPEN,0,VIF_DRIPEN,
  90.     SHADOWPEN,0,VIF_AOLDRIPEN,
  91.      0, 0,VIF_AREASTART,
  92.      2, 5,VIF_MOVE,
  93.      8, 2,VIF_DRAW,
  94.      8, 8,VIF_DRAW,
  95.      2, 5,VIF_DRAW,
  96.      0, 0,VIF_AREAEND,
  97.      0, 0,VIF_LASTITEM };
  98. struct VectorItem ZoomInImage[] =
  99.   { 22,10,VIF_SCALE,
  100.     SHADOWPEN,0,VIF_DRIPEN,
  101.      5, 5,VIF_MOVE,
  102.     16, 5,VIF_DRAW,
  103.     10, 2,VIF_MOVE
  104.     10, 8,VIF_DRAW,
  105.     11, 2,VIF_MOVE
  106.     11, 8,VIF_DRAW,
  107.      0, 0,VIF_LASTITEM };
  108. struct VectorItem ZoomOutImage[] =
  109.   { 22,10,VIF_SCALE,
  110.     SHADOWPEN,0,VIF_DRIPEN,
  111.      5, 5,VIF_MOVE,
  112.     16, 5,VIF_DRAW,
  113.      0, 0,VIF_LASTITEM };
  114.  
  115. struct CharNode *OpenCharWin(ULONG charnum,struct IBox size)
  116. {
  117. extern struct Screen *Screen;
  118. extern struct List *CharWndList;
  119. extern struct MsgPort *WndMsgPort;
  120. extern struct Image *SizeImage, *LeftImage, *RightImage;
  121. extern struct Image *UpImage, *DownImage;
  122. extern Class *EditClass;
  123. extern struct Character CharBuffer[256];
  124. extern BOOL MaxWindow, ShowBLine, DataChanged;
  125. extern ULONG Baseline;
  126. extern struct NewMenu CharMenus[];
  127.  
  128. struct CharNode *node;
  129. Object *extobj, *toolbar, *toolbarsub, *wingroup;
  130. ULONG gw,gh,top;
  131. UWORD width,height;
  132. static ULONG scroll2edit[] = { GA_ID,EG_Update,TAG_DONE };
  133.  
  134.   if ((node = CreateNode(sizeof(struct CharNode),CharWndList)) == NULL)
  135.     Quit();
  136.   if ((node->chln_Title = AllocVec(256,MEMF_CLEAR)) == NULL)
  137.     ErrorCode(ALLOCVEC);
  138.   if (charnum > 0)
  139.   {
  140.     if (charnum == 256)
  141.       sprintf(node->chln_Title,GetString(msgBlankTitle));
  142.     else
  143.       sprintf(node->chln_Title,GetString(msgCharTitle),
  144.       (char)charnum,charnum,charnum);
  145.   }
  146.   else sprintf(node->chln_Title,GetString(msgZeroTitle));
  147.   if ((node->chln_Hook = AllocVec(sizeof(struct Hook),MEMF_CLEAR)) == NULL)
  148.     ErrorCode(ALLOCVEC);
  149.   node->chln_Hook->h_Entry = CharHook;
  150.   node->chln_Hook->h_Data = node;
  151.   node->chln_Character = CharBuffer+charnum;
  152.   node->chln_Number = charnum;
  153.   width = (Prefs.PixelX*node->chln_Character->chr_Width)+(2*EG_XOFFSET)+
  154.     (2*SizeX(4))+Screen->WBorLeft+UpImage->Width;
  155.   if (width < size.Width) size.Width = width;
  156.   if (MaxWindow) size.Width = width;
  157.   height = (Prefs.PixelY*node->chln_Character->chr_Height)+(2*EG_YOFFSET)+1+
  158.     (2*SizeY(2))+Screen->WBorTop+Screen->Font->ta_YSize+LeftImage->Height;
  159.  
  160.   toolbar =
  161.     BGUI_NewObject(BGUI_GROUP_GADGET,GROUP_Spacing,SizeX(4),TAG_DONE);
  162.   if (Prefs.ToolBar & (FTBAR_WIDTHL|FTBAR_WIDTHR))
  163.   {
  164.     toolbarsub = BGUI_NewObject(BGUI_GROUP_GADGET,TAG_DONE);
  165.     if (Prefs.ToolBar & FTBAR_WIDTHL)
  166.     {
  167.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  168.     ButtonObject,
  169.       VIT_VectorArray,LineArrowLeft,
  170.       ButtonFrame,
  171.       GA_ID,ID_WIDTHL,
  172.     EndObject,
  173.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  174.       node->chln_ToolBarWidth += 22;
  175.     }
  176.     if (Prefs.ToolBar & FTBAR_WIDTHR)
  177.     {
  178.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  179.     ButtonObject,
  180.       VIT_VectorArray,LineArrowRight,
  181.       ButtonFrame,
  182.       GA_ID,ID_WIDTHR,
  183.     EndObject,
  184.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  185.       node->chln_ToolBarWidth += 22;
  186.     }
  187.     DoMethod(toolbar,GRM_ADDMEMBER,toolbarsub,TAG_DONE);
  188.   }
  189.   if (Prefs.ToolBar & (FTBAR_MOVEL|FTBAR_MOVER|FTBAR_MOVEU|FTBAR_MOVED))
  190.   {
  191.     if (node->chln_ToolBarWidth) node->chln_ToolBarWidth += SizeX(4);
  192.     toolbarsub = BGUI_NewObject(BGUI_GROUP_GADGET,TAG_DONE);
  193.     if (Prefs.ToolBar & FTBAR_MOVEL)
  194.     {
  195.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  196.     ButtonObject,
  197.       VIT_VectorArray,SolidArrowLeft,
  198.       ButtonFrame,
  199.       GA_ID,ID_MOVEL,
  200.     EndObject,
  201.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  202.       node->chln_ToolBarWidth += 22;
  203.     }
  204.     if (Prefs.ToolBar & FTBAR_MOVER)
  205.     {
  206.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  207.     ButtonObject,
  208.       VIT_VectorArray,SolidArrowRight,
  209.       ButtonFrame,
  210.       GA_ID,ID_MOVER,
  211.     EndObject,
  212.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  213.       node->chln_ToolBarWidth += 22;
  214.     }
  215.     if (Prefs.ToolBar & FTBAR_MOVEU)
  216.     {
  217.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  218.     ButtonObject,
  219.       VIT_VectorArray,SolidArrowUp,
  220.       ButtonFrame,
  221.       GA_ID,ID_MOVEU,
  222.     EndObject,
  223.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  224.       node->chln_ToolBarWidth += 22;
  225.     }
  226.     if (Prefs.ToolBar & FTBAR_MOVED)
  227.     {
  228.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  229.     ButtonObject,
  230.       VIT_VectorArray,SolidArrowDown,
  231.       ButtonFrame,
  232.       GA_ID,ID_MOVED,
  233.     EndObject,
  234.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  235.       node->chln_ToolBarWidth += 22;
  236.     }
  237.     DoMethod(toolbar,GRM_ADDMEMBER,toolbarsub,TAG_DONE);
  238.   }
  239.   if (Prefs.ToolBar & (FTBAR_KERN|FTBAR_WIDTH))
  240.   {
  241.     if (node->chln_ToolBarWidth) node->chln_ToolBarWidth += SizeX(4);
  242.     toolbarsub = BGUI_NewObject(BGUI_GROUP_GADGET,TAG_DONE);
  243.     if (Prefs.ToolBar & FTBAR_KERN)
  244.     {
  245.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  246.     ButtonObject,
  247.       VIT_VectorArray,KernImage,
  248.       ButtonFrame,
  249.       GA_ID,ID_KERNING,
  250.     EndObject,
  251.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  252.       node->chln_ToolBarWidth += 22;
  253.     }
  254.     if (Prefs.ToolBar & FTBAR_WIDTH)
  255.     {
  256.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  257.     ButtonObject,
  258.       VIT_VectorArray,WidthImage,
  259.       ButtonFrame,
  260.       GA_ID,ID_WIDTHC,
  261.     EndObject,
  262.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  263.       node->chln_ToolBarWidth += 22;
  264.     }
  265.     DoMethod(toolbar,GRM_ADDMEMBER,toolbarsub,TAG_DONE);
  266.   }
  267.   if (Prefs.ToolBar & (FTBAR_ZOOMIN|FTBAR_ZOOMOUT))
  268.   {
  269.     if (node->chln_ToolBarWidth) node->chln_ToolBarWidth += SizeX(4);
  270.     toolbarsub = BGUI_NewObject(BGUI_GROUP_GADGET,TAG_DONE);
  271.     if (Prefs.ToolBar & FTBAR_ZOOMIN)
  272.     {
  273.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  274.     ButtonObject,
  275.       VIT_VectorArray,ZoomInImage,
  276.       ButtonFrame,
  277.       GA_ID,ID_ZOOMIN,
  278.     EndObject,
  279.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  280.       node->chln_ToolBarWidth += 22;
  281.     }
  282.     if (Prefs.ToolBar & FTBAR_ZOOMOUT)
  283.     {
  284.       DoMethod(toolbarsub,GRM_ADDMEMBER,
  285.     ButtonObject,
  286.       VIT_VectorArray,ZoomOutImage,
  287.       ButtonFrame,
  288.       GA_ID,ID_ZOOMOUT,
  289.     EndObject,
  290.     FixWidth(22),FixHeight(Prefs.VecHeight),TAG_DONE);
  291.       node->chln_ToolBarWidth += 22;
  292.     }
  293.     DoMethod(toolbar,GRM_ADDMEMBER,toolbarsub,TAG_DONE);
  294.   }
  295.  
  296.   if (node->chln_ToolBarWidth > 0)
  297.   {
  298.     height += Prefs.VecHeight+SizeY(2);
  299.     node->chln_ToolBarHeight = Prefs.VecHeight+SizeY(2);
  300.   }
  301.   if (height < size.Height) size.Height = height;
  302.   SetupMenus(CharMenus);
  303.  
  304.   node->chln_Object = WindowObject,
  305.     WINDOW_Screen,Screen,
  306.     WINDOW_SharedPort,WndMsgPort,
  307.     WINDOW_MenuStrip,CharMenus,
  308.     WINDOW_Title,node->chln_Title,
  309.     WINDOW_Bounds,&size,
  310.     WINDOW_HelpFile,NAME".guide",
  311.     WINDOW_HelpNode,"char",
  312.     WINDOW_IDCMPHook,node->chln_Hook,
  313.     WINDOW_IDCMPHookBits,IDCMP_CHANGEWINDOW,
  314.     WINDOW_SizeRight,TRUE,
  315.     WINDOW_SizeBottom,TRUE,
  316.     WINDOW_CloseOnEsc,TRUE,
  317.     WINDOW_MasterGroup,
  318.       wingroup = VGroupObject,
  319.     HOffset(SizeX(4)),VOffset(SizeY(2)),Spacing(SizeY(2)),
  320.     StartMember,
  321.       extobj = ExternalObject,
  322.         EXT_MinWidth,(2*Prefs.PixelX)+(2*EG_XOFFSET)-2,
  323.         EXT_MinHeight,(2*Prefs.PixelY)+(2*EG_YOFFSET)-2,
  324.         EXT_Class,EditClass,
  325.         EXT_NoRebuild,TRUE,
  326.         EG_PixelX,Prefs.PixelX,
  327.         EG_PixelY,Prefs.PixelY,
  328.         EG_CharNode,node,
  329.         EG_CharStruct,node->chln_Character,
  330.         EG_PixelBorder,PixelBorder,
  331.         EG_ShowBaseline,ShowBLine,
  332.         EG_Baseline,Baseline,
  333.         EG_ChangePtr,&DataChanged,
  334.         GA_Disabled,FALSE,
  335.         GA_ID,ID_EDIT,
  336.       EndObject,
  337.     EndMember,
  338.       EndObject,
  339.     EndObject;
  340.   if (node->chln_Object == NULL) ErrorCode(NEWWINDOW);
  341.   node->chln_MinPixelX = Prefs.PixelX;
  342.   node->chln_MinPixelY = Prefs.PixelY;
  343.   node->chln_CurPixelX = node->chln_MinPixelX;
  344.   node->chln_CurPixelY = node->chln_MinPixelY;
  345.   if (node->chln_ToolBarHeight > 0)
  346.     DoMethod(wingroup,GRM_INSERTMEMBER,toolbar,NULL,FixMinSize,TAG_DONE);
  347.   if ((node->chln_Window = WindowOpen(node->chln_Object)) == NULL)
  348.     ErrorCode(OPENWINDOW);
  349.  
  350.   gh = MAX(LeftImage->Height,RightImage->Height);
  351.   gh = MAX(SizeImage->Height,gh);
  352.   gw = MAX(UpImage->Width,DownImage->Width);
  353.   gw = MAX(SizeImage->Width,gw);
  354.   top = Screen->WBorTop+Screen->Font->ta_YSize+1;
  355.   GetAttr(EXT_Object,extobj,&(node->chln_EditGadg));
  356.  
  357.   if ((node->chln_HorizGadg = CreatePropGadg(FREEHORIZ,
  358.     GA_Left,3,
  359.     GA_RelBottom,3-gh,
  360.     GA_RelWidth,-5-gw-LeftImage->Width-RightImage->Width,
  361.     GA_Height,gh-4,
  362.     GA_BottomBorder,TRUE,
  363.     GA_ID,GADG_HORIZ,
  364.     ICA_TARGET,node->chln_EditGadg,
  365.     ICA_MAP,scroll2edit,
  366.     PGA_Total,node->chln_Character->chr_Width,
  367.     PGA_Visible,node->chln_Character->chr_Width,TAG_DONE)) == NULL)
  368.       ErrorCode(NEWPROP);
  369.   if ((node->chln_VertGadg = CreatePropGadg(FREEVERT,
  370.     GA_RelRight,5-gw,
  371.     GA_Top,top+1,
  372.     GA_Width,gw-8,
  373.     GA_RelHeight,-top-SizeImage->Height-UpImage->Height-DownImage->Height-2,
  374.     GA_RightBorder,TRUE,
  375.     GA_Previous,node->chln_HorizGadg,
  376.     GA_ID,GADG_VERT,
  377.     ICA_TARGET,node->chln_EditGadg,
  378.     ICA_MAP,scroll2edit,
  379.     PGA_Total,node->chln_Character->chr_Height,
  380.     PGA_Visible,node->chln_Character->chr_Height,TAG_DONE)) == NULL)
  381.       ErrorCode(NEWPROP);
  382.  
  383.   if ((node->chln_LeftGadg = CreateButtonGadg(LeftImage,
  384.     GA_RelRight,1-LeftImage->Width-RightImage->Width-gw,
  385.     GA_RelBottom,1-LeftImage->Height,
  386.     GA_BottomBorder,TRUE,
  387.     GA_Previous,node->chln_VertGadg,
  388.     GA_ID,GADG_LEFT,
  389.     ICA_TARGET,node->chln_EditGadg,
  390.     ICA_MAP,scroll2edit,TAG_DONE)) == NULL) ErrorCode(NEWBUTTON);
  391.   if ((node->chln_RightGadg = CreateButtonGadg(RightImage,
  392.     GA_RelRight,1-RightImage->Width-gw,
  393.     GA_RelBottom,1-RightImage->Height,
  394.     GA_BottomBorder,TRUE,
  395.     GA_Previous,node->chln_LeftGadg,
  396.     GA_ID,GADG_RIGHT,
  397.     ICA_TARGET,node->chln_EditGadg,
  398.     ICA_MAP,scroll2edit,TAG_DONE)) == NULL) ErrorCode(NEWBUTTON);
  399.   if ((node->chln_UpGadg = CreateButtonGadg(UpImage,
  400.     GA_RelRight,1-UpImage->Width,
  401.     GA_RelBottom,1-UpImage->Height-DownImage->Height-SizeImage->Height,
  402.     GA_RightBorder,TRUE,
  403.     GA_Previous,node->chln_RightGadg,
  404.     GA_ID,GADG_UP,
  405.     ICA_TARGET,node->chln_EditGadg,
  406.     ICA_MAP,scroll2edit,TAG_DONE)) == NULL) ErrorCode(NEWBUTTON);
  407.   if ((node->chln_DownGadg = CreateButtonGadg(DownImage,
  408.     GA_RelRight,1-DownImage->Width,
  409.     GA_RelBottom,1-DownImage->Height-SizeImage->Height,
  410.     GA_RightBorder,TRUE,
  411.     GA_Previous,node->chln_UpGadg,
  412.     GA_ID,GADG_DOWN,
  413.     ICA_TARGET,node->chln_EditGadg,
  414.     ICA_MAP,scroll2edit,TAG_DONE)) == NULL) ErrorCode(NEWBUTTON);
  415.  
  416.   AddGList(node->chln_Window,node->chln_HorizGadg,-1,-1,NULL);
  417.   SetScrollers(node);
  418.   RefreshGList(node->chln_HorizGadg,node->chln_Window,NULL,-1);
  419. }
  420.  
  421. void CloseCharWin(struct CharNode *node)
  422. {
  423. extern struct Window *WidthWnd, *KernWnd;
  424. extern struct CharNode *WidthNode, *KernNode;
  425.  
  426.   ClrWindowClose(&(node->chln_Object),&(node->chln_Window));
  427.   ClrDisposeObject(&(node->chln_Object));
  428.   if (node->chln_Title)
  429.   {
  430.     FreeVec(node->chln_Title);
  431.     node->chln_Title = NULL;
  432.   }
  433.   ClrDisposeObject(&(node->chln_HorizGadg));
  434.   ClrDisposeObject(&(node->chln_VertGadg));
  435.   ClrDisposeObject(&(node->chln_LeftGadg));
  436.   ClrDisposeObject(&(node->chln_RightGadg));
  437.   ClrDisposeObject(&(node->chln_UpGadg));
  438.   ClrDisposeObject(&(node->chln_DownGadg));
  439.   if (node->chln_Hook)
  440.   {
  441.     FreeVec(node->chln_Hook);
  442.     node->chln_Hook = NULL;
  443.   }
  444.   if ((WidthWnd) && (WidthNode == node)) CloseWidthWnd(FALSE);
  445.   if ((KernWnd) && (KernNode == node)) CloseKernWnd(FALSE);
  446. }
  447.  
  448. Object *CreateSysImage(ULONG which,struct DrawInfo *dri)
  449. {
  450.   return (NewObject(NULL,SYSICLASS,
  451.     SYSIA_DrawInfo,dri,
  452.     SYSIA_Which,which,TAG_DONE));
  453. }
  454.  
  455. Object *CreatePropGadg(ULONG freedom,Tag tag1,...)
  456. {
  457.   return (NewObject(NULL,PROPGCLASS,
  458.     PGA_Freedom,freedom,
  459.     PGA_NewLook,TRUE,
  460.     PGA_Borderless,TRUE,
  461.     TAG_MORE,&tag1));
  462. }
  463.  
  464. Object *CreateButtonGadg(Object *image,Tag tag1,...)
  465. {
  466.   return (NewObject(NULL,BUTTONGCLASS,
  467.     GA_Image,image,
  468.     TAG_MORE,&tag1));
  469. }
  470.  
  471. __geta4 void CharHook(__a0 struct Hook *hook, __a2 Object *o,
  472.   __a1 struct IntuiMessage *msg)
  473. {
  474.   if ((msg->Class == IDCMP_CHANGEWINDOW) && (msg->Code == CWCODE_MOVESIZE))
  475.     ForceResizeChar(hook->h_Data);
  476. }
  477.  
  478. void ForceResizeChar(struct CharNode *node)
  479. {
  480. struct Character *chr;
  481. LONG l,t,w,h;
  482.  
  483.   chr = node->chln_Character;
  484.   GetAttr(EG_XOffset,node->chln_EditGadg,&l);
  485.   GetAttr(EG_YOffset,node->chln_EditGadg,&t);
  486.   GetAttr(EG_Width,node->chln_EditGadg,&w);
  487.   GetAttr(EG_Height,node->chln_EditGadg,&h);
  488.   if (chr->chr_Width - l < w) l = chr->chr_Width - w;
  489.   if (l < 0) l = 0;
  490.   if (chr->chr_Height - t < h) t = chr->chr_Height - h;
  491.   if (t < 0) t = 0;
  492.   SetGadgetAttrs(node->chln_EditGadg,node->chln_Window,NULL,
  493.     EG_XOffset,l,EG_YOffset,t,TAG_DONE);
  494.   SetScrollers(node);
  495. }
  496.  
  497. void SetScrollers(struct CharNode *node)
  498. {
  499. ULONG l,t,w,h;
  500.  
  501.   GetAttr(EG_XOffset,node->chln_EditGadg,&l);
  502.   GetAttr(EG_YOffset,node->chln_EditGadg,&t);
  503.   GetAttr(EG_Width,node->chln_EditGadg,&w);
  504.   GetAttr(EG_Height,node->chln_EditGadg,&h);
  505.   SetGadgetAttrs(node->chln_HorizGadg,node->chln_Window,NULL,
  506.     PGA_Top,l,PGA_Visible,w,TAG_DONE);
  507.   SetGadgetAttrs(node->chln_VertGadg,node->chln_Window,NULL,
  508.     PGA_Top,t,PGA_Visible,h,TAG_DONE);
  509. }
  510.  
  511. void RedrawEdit(struct CharNode *node)
  512. {
  513.   SetGadgetAttrs(node->chln_HorizGadg,node->chln_Window,NULL,
  514.     PGA_Total,node->chln_Character->chr_Width,TAG_DONE);
  515.   SetGadgetAttrs(node->chln_VertGadg,node->chln_Window,NULL,
  516.     PGA_Total,node->chln_Character->chr_Height,TAG_DONE);
  517.   SetGadgetAttrs(node->chln_EditGadg,node->chln_Window,NULL,
  518.     EG_Baseline,Baseline,
  519.     EG_Update,GADG_NONE,TAG_DONE);
  520.   ForceResizeChar(node);
  521. }
  522.  
  523. void MoveLeft(struct CharNode *node,struct Character *chr)
  524. {
  525. ULONG i,j;
  526.  
  527.   if (node != NULL) chr = node->chln_Character;
  528.   if ((chr->chr_Data) && (chr->chr_Width > 0))
  529.   {
  530.     for (j = 0; j < chr->chr_Height; j++)
  531.     {
  532.       for (i = 0; i < chr->chr_Width-1; i++) DATA(i,j) = DATA(i+1,j);
  533.       DATA(chr->chr_Width-1,j) = 0;
  534.     }
  535.     if (node != NULL) RedrawEdit(node);
  536.   }
  537. }
  538.  
  539. void MoveRight(struct CharNode *node,struct Character *chr)
  540. {
  541. ULONG i,j;
  542.  
  543.   if (node != NULL) chr = node->chln_Character;
  544.   if ((chr->chr_Data) && (chr->chr_Width > 0))
  545.   {
  546.     for (j = 0; j < chr->chr_Height; j++)
  547.     {
  548.       for (i = chr->chr_Width-1; i > 0; i--) DATA(i,j) = DATA(i-1,j);
  549.       DATA(0,j) = 0;
  550.     }
  551.     if (node != NULL) RedrawEdit(node);
  552.   }
  553. }
  554.  
  555. void MoveUp(struct CharNode *node,struct Character *chr)
  556. {
  557. ULONG i,j;
  558.  
  559.   if (node != NULL) chr = node->chln_Character;
  560.   if ((chr->chr_Data) && (chr->chr_Height > 0))
  561.   {
  562.     for (i = 0; i < chr->chr_Width; i++)
  563.     {
  564.       for (j = 0; j < chr->chr_Height-1; j++) DATA(i,j) = DATA(i,j+1);
  565.       DATA(i,chr->chr_Height-1) = 0;
  566.     }
  567.     if (node != NULL) RedrawEdit(node);
  568.   }
  569. }
  570.  
  571. void MoveDown(struct CharNode *node,struct Character *chr)
  572. {
  573. ULONG i,j;
  574.  
  575.   if (node != NULL) chr = node->chln_Character;
  576.   if ((chr->chr_Data) && (chr->chr_Height > 0))
  577.   {
  578.     for (i = 0; i < chr->chr_Width; i++)
  579.     {
  580.       for (j = chr->chr_Height-1; j > 0; j--) DATA(i,j) = DATA(i,j-1);
  581.       DATA(i,0) = 0;
  582.     }
  583.     if (node != NULL) RedrawEdit(node);
  584.   }
  585. }
  586.  
  587. void MoveAll(void (*MoveFunction)())
  588. {
  589. struct Character *chr;
  590. ULONG i;
  591.  
  592.   for (i = 0; i < 257; i++)
  593.   {
  594.     chr = CharBuffer+i;
  595.     MoveFunction(NULL,chr);
  596.   }
  597.   RedrawAll();
  598. }
  599.  
  600. void RedrawAll()
  601. {
  602. struct CharNode *node;
  603.  
  604.   node = CharWndList->lh_Head;
  605.   while (node->chln_Node.ln_Succ)
  606.   {
  607.     RedrawEdit(node);
  608.     CheckWidthKern(node->chln_Character);
  609.     node = node->chln_Node.ln_Succ;
  610.   }
  611. }
  612.  
  613. void ZoomIn(struct CharNode *node)
  614. {
  615. ULONG x,y,max_x,max_y;
  616.  
  617.   GetAttr(EG_PixelX,node->chln_EditGadg,&x);
  618.   GetAttr(EG_PixelY,node->chln_EditGadg,&y);
  619.  
  620.   max_x = node->chln_Window->Width-(2*EG_XOFFSET)-(2*SizeX(4))-
  621.     Screen->WBorLeft-UpImage->Width;
  622.   max_y = node->chln_Window->Height-(2*EG_YOFFSET)-1-(2*SizeY(2))-
  623.     Screen->WBorTop-Screen->Font->ta_YSize-LeftImage->Height-
  624.     node->chln_ToolBarHeight;
  625.  
  626.   if ((x*4 <= max_x) && (y*4 <= max_y))
  627.   {
  628.     SetGadgetAttrs(node->chln_EditGadg,node->chln_Window,NULL,
  629.       EG_PixelX,x*2,
  630.       EG_PixelY,y*2,
  631.       EG_Update,GADG_NONE,TAG_DONE);
  632.     SetScrollers(node);
  633.     SetMinWindowSize(node,x);
  634.   }
  635.   else DisplayBeep(node->chln_Window->WScreen);
  636. }
  637.  
  638. void ZoomOut(struct CharNode *node)
  639. {
  640. ULONG x,y;
  641.  
  642.   GetAttr(EG_PixelX,node->chln_EditGadg,&x);
  643.   GetAttr(EG_PixelY,node->chln_EditGadg,&y);
  644.  
  645.   if ((x/2 >= 2) && (y/2 >= 2))
  646.   {
  647.     SetGadgetAttrs(node->chln_EditGadg,node->chln_Window,NULL,
  648.       EG_PixelX,x/2,
  649.       EG_PixelY,y/2,
  650.       EG_Update,GADG_NONE,TAG_DONE);
  651.     SetScrollers(node);
  652.     SetMinWindowSize(node,x);
  653.   }
  654.   else DisplayBeep(node->chln_Window->WScreen);
  655. }
  656.  
  657. void SetMinWindowSize(struct CharNode *node, ULONG oldx)
  658. {
  659. ULONG x,y;
  660.  
  661.   GetAttr(EG_PixelX,node->chln_EditGadg,&x);
  662.   GetAttr(EG_PixelY,node->chln_EditGadg,&y);
  663.  
  664.   if (2*(oldx+EG_XOFFSET) < node->chln_ToolBarWidth)
  665.   {
  666.     if (2*(x+EG_XOFFSET) > node->chln_ToolBarWidth)
  667.     {
  668.       node->chln_Window->MinWidth -= node->chln_ToolBarWidth;
  669.       node->chln_Window->MinWidth += 2*(x+EG_XOFFSET);
  670.     }
  671.   }
  672.   else
  673.   {
  674.     if (2*(x+EG_XOFFSET) < node->chln_ToolBarWidth)
  675.     {
  676.       node->chln_Window->MinWidth += node->chln_ToolBarWidth;
  677.       node->chln_Window->MinWidth -= 2*(node->chln_CurPixelX+EG_XOFFSET);
  678.     }
  679.     else
  680.     {
  681.       node->chln_Window->MinWidth += 2*MAX(x,node->chln_MinPixelX);
  682.       node->chln_Window->MinWidth -= 2*node->chln_CurPixelX;
  683.     }
  684.   }
  685.   node->chln_CurPixelX = MAX(x,node->chln_MinPixelX);
  686.  
  687.   node->chln_Window->MinHeight += 2*MAX(y,node->chln_MinPixelY);
  688.   node->chln_Window->MinHeight -= 2*node->chln_CurPixelY;
  689.   node->chln_CurPixelY = MAX(y,node->chln_MinPixelY);
  690. }
  691.